home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / tool / select / select.009 < prev    next >
Text File  |  1995-02-18  |  7KB  |  291 lines

  1. /*
  2.   r.m=80 tab=4
  3.     =======================================================================
  4.    ==  <<バッチ分岐支援プログラム>>                                       ==
  5.    ==      [ select.exe ]      Ver 0.09                                   ==
  6.    ==                                     1995      Program : Y.Gotoh     ==
  7.     =======================================================================
  8. */
  9.  
  10. /*外部ファイル読み込み */
  11.  
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <string.h>
  15. #include <conio.h>
  16. #include <ctype.h>
  17. #include <gds.h>
  18. #include "gotoh.h"
  19.  
  20. /* グローバル変数の設定 */
  21.  
  22. char *wp;            /* GDSで使うワークアドレス */
  23. char *sel[20];        /* select群で使用 */
  24.  
  25. char *help={        /* ヘルプメッセージ */
  26.     "\n"
  27.     "             \"select.exe\"  Ver 0.09      1995 : Y.Gotoh (Gori)\n"
  28.     "\n"
  29.     "  select.exe [option] title sel_1 sel_b sel_c ・・・\n"
  30.     "  /h           ・・・ Help             ヘルプを表示します.\n"
  31.     "  /e           ・・・ Eending echo     終了時メッセージを表示します.\n"
  32.     "  /b[r][g][b]  ・・・ Back color       [r],[g],[b]で背景を塗ります.\n"
  33.     "  /_           ・・・ not change '_'   アンダーバーを変換しません.\n"
  34.     "  /g           ・・・ Graphic clear    終了時、グラフィックを消去します.\n"
  35.     "\n"
  36.     "  ==メニューの使い方==\n"
  37.     "      [↑],[F],[E]   ・・・・・・・・・・  カーソルを上へ移動\n"
  38.     "      [↓],[J],[X]   ・・・・・・・・・・       〃   下  〃  \n"
  39.     "     [ret],[space]   ・・・・・・・・・・  決定\n"
  40.     "         [0~9]      ・・・・・・・・・・  その番号のメニューを実行\n"
  41.     "     [esc],[Q],[q]   ・・・・・・・・・・  終了\n\n"
  42.     };
  43.  
  44.  
  45. /* 関数の定義 */
  46.  
  47. void waitkey( int wait_time);
  48. void HELP( void );
  49.  
  50. int select(int sel_max);
  51. void select_list(int sel_max);
  52. void select_prt(int sel_no,int sel_bak);
  53.  
  54. /* メイン */
  55.  
  56. int main(int argc , char *argv[])
  57. {
  58.     /* 初期設定 */
  59.     int ret,sel_max=-1,i,j;            /* sel_maxは後の所で修正されるため初期値 */
  60.                                                             /* は(-1)とする */
  61.     int pal[3]={0,0,0};                                        /* 背景パレット */
  62.     char dmy;                                                    /* 雑用char*/
  63.     
  64.     int end_echo=0;        /* エンディングエコーの表示非表示。初期(0)は非表示 */
  65.     int end_clear=0;    /* 実行後のグラフィックのクリア。初期(0)はしない。 */
  66.     int under_bar=1;    /* アンダーバー変換。初期(1)はする。*/
  67.     
  68.     /* 画面消去・設定 */
  69.     
  70.     txt_cls();
  71.     txt_csl(0);                                            /* カーソル表示off */
  72.     GDS_write_page(1);                                    /* page1を使用 */
  73.     GDS_display_page(1);
  74.     GDS_all_clear();
  75.     
  76.     /* パラメータの読み込み */
  77.     
  78.     if(argc<2)    HELP();                        /* パラメータ無しはヘルプ表示 */
  79.     
  80.     for(i=1;i<argc;i++)
  81.     {
  82.         if(*(argv[i])=='/' || *(argv[i])=='-')    /* '/','-'のどちらにも対応 */
  83.         {
  84.             tolower( *(argv[i]+1) );
  85.             
  86.             switch(*(argv[i]+1))
  87.             {
  88.                 case 'e':                    /* 終了メッセージを表示する */
  89.                     end_echo=1;
  90.                 break;
  91.                 
  92.                 case 'h':                                        /* ヘルプ */
  93.                     HELP();
  94.                 break;
  95.                 
  96.                 case 'g':                    /* 終了時のG画面の消去をする */
  97.                     end_clear=1;
  98.                 break;
  99.                 
  100.                 case '_':                    /* アンダーバー変換をしない */
  101.                     under_bar=0;
  102.                 break;
  103.                 
  104.                 case 'b':
  105.                     strlwr(argv[i]);
  106.                     for(j=2;j<strlen(argv[i]);j++)
  107.                     {
  108.                         dmy=*(argv[i]+j);
  109.                         
  110.                         if(dmy>=0x61 && dmy<=0x66)        /* a~fは10~15へ */
  111.                         {
  112.                             pal[j-2]=(9+(dmy-0x30))*16;
  113.                         }
  114.                         else    pal[j-2]=(atoi(&dmy))*16;
  115.                     }
  116.                     GDS_palette(0,pal[0],pal[1],pal[2]);
  117.                 break;
  118.                 
  119.                 default:
  120.                     printf("オプション[%c]には未対応.\n",(argv[i]+1));
  121.                     waitkey(10);
  122.             }
  123.         }
  124.         else
  125.         {
  126.             sel_max++;
  127.             sel[sel_max]=argv[i];
  128.         }
  129.     }
  130.     
  131.     if(sel_max<2)
  132.     {
  133.         txt_color(1);                                                /* 赤 */
  134.         printf("\nerror!! 選択肢の数が足りません!!\n");
  135.         txt_color(7);                                                /* 白 */
  136.         HELP();
  137.     }
  138.     
  139.     if(under_bar)                            /* under_barが0なら処理をしない */
  140.     {
  141.         for(i=0;i<=sel_max;i++)
  142.         {
  143.             for(j=0;j<strlen(sel[i]);j++)                /* アンダーバーをス */
  144.             {                                            /* ペースに変換する。 */
  145.                 if( *(sel[i]+j)=='_' )
  146.                 {
  147.                     *(sel[i]+j)=' ';
  148.                 }
  149.             }
  150.         }
  151.     }
  152.     
  153.     /* タイトル */
  154.     locate(20,1);
  155.         txt_color(3);
  156.         printf(    "------------------------------------------\n");
  157.     locate(20,2);
  158.         printf(    " [select,exe]     1995 program : Y.Gotoh \n");
  159.     locate(20,3);
  160.         printf(    "------------------------------------------\n");
  161.     txt_color(7);
  162.     
  163.     /* メインプログラム */
  164.     
  165.     ret=select(sel_max);                                /* 選択ルーチンへ */
  166.     if(ret==-1)    ret=0;                    /* エスケープ終了は通常終了にする */
  167.     
  168.     /* 終了処理 */
  169.     
  170.     txt_cls();
  171.     if(end_echo)                    /* end_echo が 0 以外ならメッセージ表示 */
  172.     {
  173.         printf(    "[select.exe] Ver 0.09  program : Y.Gotoh\n"
  174.                 "    returned error level [%d]\n",ret);
  175.     }
  176.     txt_csl(1);                                            /* カーソルの表示 */
  177.     if(end_clear)    GDS_palette(0,0,0,0);    /* end_clearが0以外なら画面消去 */
  178.     exit(ret);
  179. }
  180.  
  181. /* select : 項目選択用サブ ,*sel[] をグローバルで用意すること */
  182. int select(int sel_max)
  183. {
  184.     int sel_no=1,sel_bak=1,ret=0;
  185.     char key='\0';                            /* とりあえずループさせるために */
  186.     
  187.     locate(20,5);
  188.         printf("%s\n",sel[0]);                        /* メニュータイトル表示 */
  189.     
  190.     select_list(sel_max);                                        /* 一覧表示 */
  191.     select_prt(sel_no,sel_bak);            /* 初期位置(1)にカーソルを持ってくる */
  192.     
  193.     do
  194.     {
  195.         key=getch();
  196.         key=tolower(key);
  197.         
  198.         /* [↑,F,E]の時 */
  199.         if(key=='\x1e' || key=='\x66' || key=='\x65')
  200.         {
  201.             sel_bak=sel_no;
  202.             sel_no--;
  203.             if(sel_no<1) sel_no=sel_max;
  204.             select_prt(sel_no,sel_bak);
  205.         }
  206.         
  207.         /* [↓,J,X]の時 */
  208.         if(key == '\x1f' || key=='\x6a' || key=='\x78')
  209.         {
  210.             sel_bak=sel_no;
  211.             sel_no++;
  212.             if(sel_no>sel_max) sel_no=1;
  213.             select_prt(sel_no,sel_bak);
  214.         }
  215.         
  216.         /* 各数字(0~9)が押された時 */
  217.         if(key >= '\x30' && key <= '\x39')
  218.         {
  219.             sel_bak=sel_no;
  220.             sel_no=(int)key-0x30;
  221.             if(sel_no==0) sel_no=10;
  222.             if(sel_no>sel_max)
  223.             {
  224.                 sel_no=sel_bak;
  225.             }
  226.             else
  227.             {
  228.                 select_prt(sel_no,sel_bak);
  229.                 waitkey(20);
  230.                 key='\x0d';
  231.             }
  232.         }
  233.     }while(key != '\x0d' && key != '\x1b' && key != '\x20' && key != '\x71');
  234.     
  235.     if(key == '\x0d' || key == '\x20' )    ret=sel_no;    /* [space],[ret]なら
  236.                                                             選択番号を返す */
  237.     if(key == '\x71')    ret=0;                    /* [Q],[q]なら終了(ret=0) */
  238.     if(key == '\x1b')    ret=-1;                        /* [esc]なら-1を返す */
  239.     
  240.     return(ret);
  241. }
  242.  
  243. /* 選択肢一覧表示 */
  244. void select_list(int sel_max)
  245. {
  246.     int i;
  247.     
  248.     for(i=1;i<=sel_max;i++)
  249.     {
  250.         locate(19,i+6);
  251.         if(i<10)    printf("%1d: %s",i,sel[i]);
  252.             else    printf("%d: %s",i-10,sel[i]);    /* 10は、0と表示する */
  253.     }
  254. }
  255.  
  256. /* 選択カーソル表示ルーチン */
  257. void select_prt(int sel_no,int sel_bak)
  258. {
  259.     locate(19,sel_bak+6);                        /* 黄色の帯を消す */
  260.     if(sel_bak<10){
  261.         printf("%1d: %s",sel_bak,sel[sel_bak]);
  262.     }
  263.     else    printf("%1d: %s",sel_bak-10,sel[sel_bak]);    /* 10は0に */
  264.     
  265.     locate(19,sel_no+6);                            /* 新しく帯を引く */
  266.     if(sel_no<10){
  267.         printf("\x1b[7;33m%1d: %s\x1b[0;37m",sel_no,sel[sel_no]);
  268.     }
  269.     else    printf("\x1b[7;33m%1d: %s\x1b[0;37m",sel_no-10,sel[sel_no]);
  270. }
  271.  
  272. /* サブルーチン */
  273.  
  274. /* 何かキーを押すか一定時間経つと処理を復帰するサブ */
  275. void waitkey(int wait_time)
  276. {
  277.     int i=0;
  278.     
  279.     for(i=0;i<wait_time*10;i++)
  280.     {
  281.         if( kbhit() != 0)    break;
  282.     }
  283. }
  284.  
  285. /* ヘルプを表示するサブ */
  286. void HELP(void)
  287. {
  288.     printf("%s",help);
  289.     exit(0);
  290. }
  291.